package GUI;

/**
 *
 * @author David Ponce
 * @author Philipp Armbruster
 */

import Interaction.ServerConnection;
import Data.*;
import Flightadministration.Flightadministration;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.rmi.RemoteException;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.Vector;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;


public class AircraftEdit extends JPanel {

    final Main td;
    public JLabel label2;
    public JLabel label6;
    public String currentAircraftName;
    public JTextField textfield1;
    public Vector<Aircraft> allAircrafts;
    public Vector<TypeOfAircraft> allTypeOfAircrafts;
    public Vector<String> allTypeOfAircraftNames;
    public Vector<Airline> allAirlines;
    public Vector<String> allAirlineNames;
    public JComboBox comboBox2;
    public DefaultComboBoxModel model2;
    private JPanel jp;
    /*Das AdministrationsObjekt, welches über die getConnection methode vom RMI Server geholt wird, dem "admin" objekt zugewiesen.
    *Dadurch ist eine Kommunikation zwischen GUI und Applikationsserver mittels RMI möglich*/
    final Flightadministration admin = ServerConnection.getConnection();


    // Konstruktor
    public AircraftEdit(final Main td) throws RemoteException {
        
        this.td = td;
        showAircraftEdit();
    }


    // Methode
    public void showAircraftEdit()throws RemoteException {

        jp = new JPanel();

        //GridBagLayout
        //**********************************************************************
        GridBagLayout gbl = new GridBagLayout();
        jp.setLayout(gbl);
        jp.setBackground(Color.white);

        GridBagConstraints constraints = new GridBagConstraints();

        constraints.fill = GridBagConstraints.HORIZONTAL;   // wie Komponente Bereich füllen soll
        constraints.weightx = 1;                     // Breite
        constraints.weighty = 3;                    // Höhe
        constraints.insets = new Insets(0,0,1,1);   // Abstände definieren


        //Label
        //**********************************************************************

        JLabel headline = new JLabel("<html><h2 color=blue>Flugzeug bearbeiten</h2></html>");
        headline.setHorizontalAlignment(JLabel.CENTER);
        constraints.gridx = 0;
        constraints.gridy = 0;
        constraints.gridwidth = 2;
        jp.add(headline, constraints);

        label2 = new JLabel();

        JLabel label3 = new JLabel("Kennzeichen: ");
        constraints.gridx = 0;
        constraints.gridy = 1;
        constraints.gridwidth = 1;
        jp.add(label3, constraints);

        textfield1 = new JTextField();
        constraints.gridx = 1;
        constraints.gridy = 1;
        constraints.gridwidth = 1;
        jp.add(textfield1, constraints);

        JLabel label4 = new JLabel("Flugzeugtyp:");
        constraints.gridx = 0;
        constraints.gridy = 2;
        constraints.gridwidth = 1;
        jp.add(label4, constraints);

        label6 = new JLabel();
        constraints.gridx = 1;
        constraints.gridy = 2;
        constraints.gridwidth = 1;
        jp.add(label6, constraints);

        JLabel label5 = new JLabel("Fluglinie auswählen: ");
        constraints.gridx = 0;
        constraints.gridy = 3;
        constraints.gridwidth = 1;
        jp.add(label5, constraints);

        // Vector mit allen Fluglinien aus der Datenbank befüllen
        allAirlines = admin.getAllAirlinesForComboBox();
        // Vector mit Namen aller Fluglinien aus der Datenbank befüllen
        allAirlineNames = admin.getAllAirlineNamesForComboBox();
        // Neues Model für die ComboBox erzeugen und die Fluglinienbezeichnungen übergeben
        model2 = new DefaultComboBoxModel(allAirlineNames);

        comboBox2 = new JComboBox();
        comboBox2.setModel(model2);
        constraints.gridx = 1;
        constraints.gridy = 3;
        constraints.gridwidth = 1;
        jp.add(comboBox2, constraints);


        //Buttons
        //**********************************************************************
        JButton button_UpdateAircraft = new JButton("Änderungen speichern");
        constraints.gridx = 0;
        constraints.gridy = 4;
        constraints.gridwidth = 1;
        jp.add(button_UpdateAircraft, constraints);

        JButton button_Cancel = new JButton("Zurück zur Übersicht");
        constraints.gridx = 1;
        constraints.gridy = 4;
        constraints.gridwidth = 1;
        jp.add(button_Cancel, constraints);


        //Action Listener
        //**********************************************************************
        button_UpdateAircraft.addActionListener(new ActionListener() {
                @Override
            public void actionPerformed(ActionEvent e){
                if ((textfield1.getText().equals("")))
                {
                    JOptionPane.showMessageDialog(null, "Bitte Kennzeichen angeben!");
                }
                else {
                    try {
                        // Alle Flugzeuge aus der Datenbank auslesen
                        allAircrafts = admin.getAllAircraftsForComboBox();
                        // Vector über nachfolgende for-Schleife mit allen Flugzeugnamen befüllen
                        Vector<String> allAircraftNames = new Vector<String>();

                        for(int i = 0; i<allAircrafts.size(); i++) {
                            String aircraftName = allAircrafts.get(i).getCraftName();
                            allAircraftNames.add(aircraftName);
                        }

                        /* Alle Flugzeugtypen aus der Datenbank auslesen,
                         * diese werden im späteren Verlauf benötigt */
                        allTypeOfAircrafts = admin.getAllTypeOfAircraftsForComboBox();

                        // Prüfen ob der Inhalt des Textfeldes noch derselbe ist wie vor der Bearbeitung
                        if(textfield1.getText().equals(currentAircraftName)) {

                            /**
                             * Wenn ja, werden die Änderungen übernommen und die Daten das Flugzeuges in der Datenbank aktualisiert
                             */

                                // Flugzeugnummer auslesen
                                int idAsInt = Integer.parseInt(label2.getText());
                                // Flugzeugname auslesen
                                String currentCraftName = textfield1.getText();

                                /* Die Id des Flugzeugtypes ermitteln indem der Inhalt des entsprechenden Labels
                                 * mit dem Inhalt des Vectors abgeglichen wird */
                                int currentTypeOfAircraftId = 0;
                                // Über eine for-Schleife die Id des Flugzeugtyps auslesen und in die Variable 'currentTypeOfAircraftId' speichern
                                for(int i = 0; i<allTypeOfAircrafts.size(); i++) {
                                    if(allTypeOfAircrafts.get(i).getCraftTypeName().equals(label6.getText())) {
                                        currentTypeOfAircraftId = allTypeOfAircrafts.get(i).getCraftTypeId();
                                    }
                                }

                                // Den Namen der ausgewählten Fluglinie (Airline) aus der Combobox auslesen
                                String currentAirline = String.valueOf(comboBox2.getSelectedItem());
                                int currentAirlineId = 0;
                                // Über eine for-Schleife die Id der Fluglinie auslesen und in die Variable 'currentAirlineId' speichern
                                for(int i = 0; i<allAirlines.size(); i++) {
                                    if(allAirlines.get(i).getAirName().equals(currentAirline)) {
                                        currentAirlineId = allAirlines.get(i).getAirId();
                                    }
                                }

                                // Änderungen in die Datenbank speichern
                                admin.updateAircraft(idAsInt, currentCraftName, currentAirlineId, currentTypeOfAircraftId);
                                    // JTables aktualisieren
                                    td.updateAircraft();

                                JOptionPane.showMessageDialog(null, "Flugzeug geändert");

                                ((CardLayout) td.rightp.getLayout()).show(td.rightp,"AircraftM");
                        }
                        /**
                         * Wenn nicht, wird geprüft ob es ein Flugzeug mit dem eingegebenen Namen bereits gibt
                         */
                        else if(allAircraftNames.contains(textfield1.getText())) {
                                /**
                                 * Wenn ja, wird eine entsprechende Meldung ausgeben
                                 */ 
                                JOptionPane.showMessageDialog(null, "<html><p style=\"color:red; text-align: center\">" +
                                                                    "Es ist bereits ein Flugzeug mit der Bezeichnung " + textfield1.getText() + " vorhanden,<br>" +
                                                                    "bitte wählen Sie daher eine andere Bezeichnung aus,<br>" + "" +
                                                                    "da diese weltweit eindeutig sein muss!" +
                                                                    "</p></html>");
                            }
                            else {
                            
                                /**
                                 * Wenn nicht, werden die Änderungen übernommen und die Daten das Flugzeuges in der Datenbank aktualisiert
                                 */

                                    // Flugzeugnummer auslesen
                                    int idAsInt = Integer.parseInt(label2.getText());
                                    // Flugzeugname auslesen
                                    String currentCraftName = textfield1.getText();

                                    /* Die Id des Flugzeugtypes ermitteln indem der Inhalt des entsprechenden Labels
                                     * mit dem Inhalt des Vectors abgeglichen wird */
                                    int currentTypeOfAircraftId = 0;
                                    // Über eine for-Schleife die Id des Flugzeugtyps auslesen und in die Variable 'currentTypeOfAircraftId' speichern
                                    for(int i = 0; i<allTypeOfAircrafts.size(); i++) {
                                        if(allTypeOfAircrafts.get(i).getCraftTypeName().equals(label6.getText())) {
                                            currentTypeOfAircraftId = allTypeOfAircrafts.get(i).getCraftTypeId();
                                        }
                                    }

                                    // Den Namen der ausgewählten Fluglinie (Airline) aus der Combobox auslesen
                                    String currentAirline = String.valueOf(comboBox2.getSelectedItem());
                                    int currentAirlineId = 0;
                                    // Über eine for-Schleife die Id der Fluglinie auslesen und in die Variable 'currentAirlineId' speichern
                                    for(int i = 0; i<allAirlines.size(); i++) {
                                        if(allAirlines.get(i).getAirName().equals(currentAirline)) {
                                            currentAirlineId = allAirlines.get(i).getAirId();
                                        }
                                    }

                                    // Änderungen in die Datenbank speichern
                                    admin.updateAircraft(idAsInt, currentCraftName, currentAirlineId, currentTypeOfAircraftId);
                                        // JTables aktualisieren
                                        td.updateAircraft();

                                    JOptionPane.showMessageDialog(null, "Flugzeug geändert");

                                    ((CardLayout) td.rightp.getLayout()).show(td.rightp,"AircraftM");

                            }

                    } catch (RemoteException ex) {
                        Logger.getLogger(AircraftEdit.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
            }
        });

        
        button_Cancel.addActionListener(new ActionListener() {
                @Override
        public void actionPerformed(ActionEvent e){

            ((CardLayout) td.rightp.getLayout()).show(td.rightp,"AircraftM");

            }
        });
    }

    
    public JPanel getJp() {
        return jp;
    }
}

